library(tidyverse)
library(readxl)
library(countrycode)
library(gganimate)
url1 <- "https://query.data.world/s/tw3oaknxjlqods27xzzbpa3do4rmfr"
p1f <- tempfile()
download.file(url1, p1f, mode = "wb")
happy_data <- read_excel(path = p1f)
colnames(happy_data) <- c("WP5_Country", "country.name", "Year", "Happiness", "GDP", "Soc_Support", "Life_Exp", "Choice_Freedom", "Generosity", "Corrupt_Percept", "Pos_Aff", "Neg_Aff", "Gov_Confident", "Democratic_Qual", "Delivery_Qual", "HappySD", "HappySD_Mean", "Bank_Index", "Bank_Index_Past", "Income", "Trust", "Trust81", "Trust89", "Trust94", "Trust99", "Trust05", "Trust10")

#Create a continent column
happy_data$continent <- NA

#Set the country and continent columns as characters
happy_data$country.name <- as.character(happy_data$country.name)
happy_data$continent <-as.character(happy_data$continent)

#Map country name onto continent
happy_data <- happy_data %>%
  mutate(continent = countrycode(sourcevar = country.name, origin = "country.name", destination = "continent")) %>%
  select(continent, everything())
## Warning in countrycode(sourcevar = country.name, origin = "country.name", : Some values were not matched unambiguously: Kosovo
str(happy_data)
## Classes 'tbl_df', 'tbl' and 'data.frame':    1420 obs. of  28 variables:
##  $ continent      : chr  "Asia" "Asia" "Asia" "Asia" ...
##  $ WP5_Country    : chr  "Afghanistan" "Afghanistan" "Afghanistan" "Afghanistan" ...
##  $ country.name   : chr  "Afghanistan" "Afghanistan" "Afghanistan" "Afghanistan" ...
##  $ Year           : num  2008 2009 2010 2011 2012 ...
##  $ Happiness      : num  3.72 4.4 4.76 3.83 3.78 ...
##  $ GDP            : num  7.2 7.36 7.42 7.45 7.55 ...
##  $ Soc_Support    : num  0.451 0.552 0.539 0.521 0.521 ...
##  $ Life_Exp       : num  47.6 47.9 48.2 48.5 48.7 ...
##  $ Choice_Freedom : num  0.718 0.679 0.6 0.496 0.531 ...
##  $ Generosity     : num  0.183 0.205 0.139 0.176 0.248 ...
##  $ Corrupt_Percept: num  0.882 0.85 0.707 0.731 0.776 ...
##  $ Pos_Aff        : num  0.518 0.584 0.618 0.611 0.71 ...
##  $ Neg_Aff        : num  0.258 0.237 0.275 0.267 0.268 ...
##  $ Gov_Confident  : num  0.612 0.612 0.299 0.307 0.435 ...
##  $ Democratic_Qual: num  -1.96 -2.08 -2.02 -1.94 -1.86 ...
##  $ Delivery_Qual  : num  -1.67 -1.65 -1.63 -1.62 -1.44 ...
##  $ HappySD        : num  1.77 1.72 1.88 1.79 1.8 ...
##  $ HappySD_Mean   : num  0.477 0.391 0.395 0.466 0.475 ...
##  $ Bank_Index     : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ Bank_Index_Past: num  NA NA NA NA NA NA NA NA NA 0.305 ...
##  $ Income         : num  NA 0.442 0.327 0.337 0.345 ...
##  $ Trust          : num  NA 0.286 0.276 NA NA ...
##  $ Trust81        : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ Trust89        : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ Trust94        : num  NA NA NA NA NA ...
##  $ Trust99        : num  NA NA NA NA NA ...
##  $ Trust05        : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ Trust10        : num  NA NA NA NA NA NA NA NA NA NA ...
happy_data_cont <- happy_data %>% 
  filter(!is.na(continent))

#Plot happiness against year, split by continent, colour by country (Scatter)
ggplot(happy_data_cont, aes (x = Year, y = Happiness, colour = continent)) + 
  geom_point(alpha = .5, show.legend = TRUE) + 
  facet_wrap(~continent)

#Plot happiness against year, split by continent, colour by country (Line)
ggplot(happy_data_cont, aes (x = Year, y = Happiness, colour = country.name)) + 
  geom_line() + 
  facet_wrap(~continent) + 
  theme(legend.position="none")

ggplot(happy_data_cont, aes (x = country.name, y = Happiness, fill = continent)) + 
  geom_bar(stat = "identity", width = 2.0) +
  facet_wrap(~continent) +
  theme(legend.position="none") +
  geom_text(aes(label = country.name), angle = 90) +
  transition_time(Year)
## Warning: position_stack requires non-overlapping x intervals

## Warning: position_stack requires non-overlapping x intervals

## Warning: position_stack requires non-overlapping x intervals

## Warning: position_stack requires non-overlapping x intervals

## Warning: position_stack requires non-overlapping x intervals

## Warning: position_stack requires non-overlapping x intervals

## Warning: position_stack requires non-overlapping x intervals

## Warning: position_stack requires non-overlapping x intervals

## Warning: position_stack requires non-overlapping x intervals

## Warning: position_stack requires non-overlapping x intervals

## Warning: position_stack requires non-overlapping x intervals

## Warning: position_stack requires non-overlapping x intervals

## Warning: position_stack requires non-overlapping x intervals

## Warning: position_stack requires non-overlapping x intervals

## Warning: position_stack requires non-overlapping x intervals

## Warning: position_stack requires non-overlapping x intervals

## Warning: position_stack requires non-overlapping x intervals

## Warning: position_stack requires non-overlapping x intervals

## Warning: position_stack requires non-overlapping x intervals

## Warning: position_stack requires non-overlapping x intervals

## Warning: position_stack requires non-overlapping x intervals

## Warning: position_stack requires non-overlapping x intervals

## Warning: position_stack requires non-overlapping x intervals

## Warning: position_stack requires non-overlapping x intervals

## Warning: position_stack requires non-overlapping x intervals

## Warning: position_stack requires non-overlapping x intervals

## Warning: position_stack requires non-overlapping x intervals

## Warning: position_stack requires non-overlapping x intervals

## Warning: position_stack requires non-overlapping x intervals

## Warning: position_stack requires non-overlapping x intervals

## Warning: position_stack requires non-overlapping x intervals

## Warning: position_stack requires non-overlapping x intervals

## Warning: position_stack requires non-overlapping x intervals

## Warning: position_stack requires non-overlapping x intervals

## Warning: position_stack requires non-overlapping x intervals

## Warning: position_stack requires non-overlapping x intervals

## Warning: position_stack requires non-overlapping x intervals

## Warning: position_stack requires non-overlapping x intervals

## Warning: position_stack requires non-overlapping x intervals

## Warning: position_stack requires non-overlapping x intervals

## Warning: position_stack requires non-overlapping x intervals

## Warning: position_stack requires non-overlapping x intervals

## Warning: position_stack requires non-overlapping x intervals

## Warning: position_stack requires non-overlapping x intervals

## Warning: position_stack requires non-overlapping x intervals

## Warning: position_stack requires non-overlapping x intervals

happy_2016 <- happy_data %>% filter(Year == "2016")

empty_bar = 10
to_add = matrix(NA, empty_bar, ncol(happy_2016))
colnames(to_add) = colnames(happy_2016)
happy_2016 = rbind(happy_2016, to_add)
happy_2016$id = seq(1, nrow(happy_2016))

label_data <- happy_2016
number_of_bar <- nrow(label_data)
angle = 90-360*(label_data$id-0.5)/number_of_bar
label_data$hjust<-ifelse(angle < -90, 1, 0)
label_data$angle<-ifelse(angle < -90, angle+180, angle)

ggplot(happy_2016, aes(x=as.factor(id), y = Happiness)) +
  geom_bar(stat="identity", fill=alpha("green", 0.3)) +
  ylim(-100,120) +
  theme_minimal() +
  coord_polar(start = 0) +
  theme(
    axis.text = element_blank(),
    axis.title = element_blank(),
    panel.grid = element_blank(),
    plot.margin = unit(rep(-1,4), "cm")) +
  geom_text(data=label_data, aes(x=id, y=Happiness, label=country.name), color="black", fontface="bold", alpha=0.6, size=2.5, angle=label_data$angle, hjust=label_data$hjust)
## Warning: Removed 10 rows containing missing values (position_stack).
## Warning: Removed 10 rows containing missing values (geom_text).